/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package generadorva;

import DistLib.*;
import ec.util.MersenneTwisterFast;
import java.text.DecimalFormat;

/**
 *
 * @author USUARIO
 */
public class InventarioQs {


    public static void main(String[] args) {
        /**
         * Simulacion de un inventario (Q,s)
         * con pedido al final del dia
         */
        MersenneTwisterFast prng = new MersenneTwisterFast(4785456);
        BoxMuller demanda = new BoxMuller(50, 9);
        LeapTime leapTime = new LeapTime();
        int inventarioInicial = 480;
        int inventarioFinal = 480;
        int Q = 500;
        int s = 200;
        int n = 250;
        int diasEntrega = -1;
        boolean pedido = false;
        int demandaAcumulada;
        int sumaQ;
        int sumaq2;
        int k = 10;
        long sumaQs = 0;
        long suma2Qs = 0;
        for (int j = 0; j < k; j++) {
            sumaQ = 0;
            sumaq2 = 0;
            demandaAcumulada = 0;
            for (int i = 0; i < n; i++) {
                int di = (int) Math.round(demanda.generate(prng));
                if (inventarioFinal < di) {
                    demandaAcumulada += di - inventarioFinal;
                    inventarioFinal = 0;
                } else {
                    inventarioFinal = inventarioInicial - di;
                }
                if (inventarioFinal < s && !pedido) {
                    pedido = true;
                    diasEntrega = leapTime.generate(prng.nextDouble());
                }
                if (pedido) {
                    if (diasEntrega == 0) {
                        inventarioFinal +=Q;
                        pedido = false;
                    }
                    diasEntrega--;
                }
                //System.out.println(inventarioInicial + "\t" + di + "\t" + inventarioFinal + "\t"+ pedido + "\t"+ (diasEntrega+1));
                inventarioInicial = inventarioFinal;
                sumaQ += inventarioFinal;
                sumaq2 += inventarioFinal*inventarioFinal;
            }
            double mediaQ = (sumaQ/n);
            double varianzaQ = (sumaq2 - n*mediaQ*mediaQ)/(n-1);
            System.out.println("\ndemanda perdida: " + demandaAcumulada);
            System.out.println("inventario promedio: " + mediaQ);
            System.out.println("varianza del inventario: " + varianzaQ);
            System.out.println("--------------------------------------");
            sumaQs += mediaQ;
            suma2Qs += mediaQ*mediaQ;
        }
        double mediaRealQ = sumaQs/k;
        double varianzaRealQ = (suma2Qs - k*mediaRealQ*mediaRealQ)/(k-1);
        System.out.println("media real: " + mediaRealQ);
        System.out.println("varianza real: " + varianzaRealQ);
        
        double limInferior = mediaRealQ - t.quantile(1-0.05, k-1);
        double limSuperior = mediaRealQ + t.quantile(1-0.05, k-1);
        DecimalFormat decimalFormat = new DecimalFormat("####.######");
        System.out.println("hat(m_q){" + decimalFormat.format(limInferior) +" , " + decimalFormat.format(limSuperior) + "}");
        
        
        
        /**
         * Simulacion de un inventario (Q,s)
         * con pedido al final de una transaccion
         *//*
        MersenneTwisterFast prng = new MersenneTwisterFast(4785456);
        Poisson poisson = new Poisson(10);
        LeapTime leapTime = new LeapTime();
        BoxMuller boxMuller = new BoxMuller(5,1);
        int inventarioInicial = 480;
        int inventarioFinal = 480;
        int Q = 500;
        int s = 200;
        int n = 250;
        int diasEntrega = -1;
        boolean pedido = false;
        int demandaAcumulada = 0;
        int transaccionesTotales = 0;
        for (int i = 0; i < n; i++) {
            if (pedido) {
                if (diasEntrega == 0) {
                    inventarioFinal +=Q;
                    pedido = false;
                }
                diasEntrega--;
            }
            int numTransacciones = poisson.generate(prng.nextDouble());
            int di = 0;
            boolean diaCero = false;
            System.out.println("numero transacciones: "+numTransacciones);
            for (int j = 0; j < numTransacciones; j++) {
                transaccionesTotales++;
                int pedidoTransaccion = (int) Math.round(boxMuller.generate(prng));
                di += pedidoTransaccion;
                if (inventarioFinal < pedidoTransaccion) {
                    demandaAcumulada += pedidoTransaccion - inventarioFinal;
                    inventarioFinal = 0;
                } else {
                    inventarioFinal = inventarioFinal - pedidoTransaccion;
                }
                if (inventarioFinal < s && !pedido) {
                    pedido = true;
                    diaCero = true;
                    diasEntrega = leapTime.generate(prng.nextDouble());
                }
                System.out.println(inventarioInicial + "\t" + pedidoTransaccion + "\t" + inventarioFinal + "\t"+ pedido + "\t"+ (diasEntrega+1));
            }
            if (diaCero) {
                diaCero = false;
                diasEntrega++;
            }
            
            //System.out.println(inventarioInicial + "\t" + di + "\t" + inventarioFinal + "\t"+ pedido + "\t"+ (diasEntrega+1));
            inventarioInicial = inventarioFinal;
        }
        System.out.println("\ndemanda perdida: " + demandaAcumulada);
        System.out.println("transacciones totales: " + transaccionesTotales);*/
    }

}
